"use strict";
var MySnake;
(function (MySnake) {
    //绘制蛇身体 
    var Draw = /** @class */ (function () {
        function Draw() {
        }
        /**
         * 擦除蛇身
         * @param {Array<SnakeBody>} p_Bodies - 蛇身体集合。
         * @param {HTMLTableElement} p_Table - 游戏容器对象。
         */
        Draw.Erase = function (p_Bodies, p_Table) {
            for (var i = 0; i < p_Bodies.length; i++) {
                this.EraseDot(p_Bodies[i].X, p_Bodies[i].Y, p_Table);
            }
        };
        /**
         * 擦除点
         * @param {number} x - 单元格的列数。
         * @param {number} y - 单元格的行数。
         * @param {HTMLTableElement} p_Table - 游戏容器对象。
         */
        Draw.EraseDot = function (x, y, p_Table) {
            p_Table.rows[y].cells[x].style.backgroundColor = "";
        };
        /**
        * 绘制蛇身
        * @param {Array<SnakeBody>} p_Bodies - 蛇身体集合。
        * @param {HTMLTableElement} p_Table - 游戏容器对象。
        */
        Draw.Paint = function (p_Bodies, p_Table) {
            for (var i = 0; i < p_Bodies.length; i++) {
                if (i == 0) {
                    this.PaintDot(p_Bodies[i].X, p_Bodies[i].Y, p_Table, this.GetRandomColor());
                }
                else {
                    this.PaintDot(p_Bodies[i].X, p_Bodies[i].Y, p_Table);
                }
            }
        };
        /**
         * 绘制点
         * @param {number} x - 单元格的列数。
         * @param {number} y - 单元格的行数。
         * @param {HTMLTableElement} p_Table - 游戏容器对象。
         */
        Draw.PaintDot = function (x, y, p_Table, paintColor) {
            if (paintColor === void 0) { paintColor = "red"; }
            p_Table.rows[y].cells[x].style.backgroundColor = paintColor;
        };
        /**
         * 检查下一节点运行状态
         * @param {Array<SnakeBody>} p_Bodies - 蛇身体集合
         * @param {MoveDirection} p_Direction - 运动方向
         * @param {number} p_ColumnCount - 列的数量
         * @param {number} p_RowCount - 行的数量
         * @param {HTMLTableElement} p_Table - 游戏容器对象
         */
        Draw.CheckNextStep = function (p_Bodies, p_Direction, p_ColumnCount, p_RowCount, p_Table) {
            var _NewBody = this.GetNextPosition(p_Bodies, p_Direction);
            if (_NewBody.X < 0 || _NewBody.X >= p_ColumnCount || _NewBody.Y < 0 || _NewBody.Y >= p_RowCount) {
                return -1; //到达边界, 游戏结束
            }
            /*
            for (var i = 0; i < p_Bodies.length; i++) {
                if (p_Bodies[i].X == _NewBody.X && p_Bodies[i].Y == _NewBody.Y) {
                    return -1; //碰到蛇身，游戏结束
                }
            }
            */
            if (this.IsCellFilled(p_Table, _NewBody.Y, _NewBody.Y)) {
                return 1; //有食物
            }
            //空白行继续运行
            return 0;
        };
        /**
         * 获得蛇头运行下一节点的坐标
         * @param {Array<SnakeBody>} p_Bodies - 蛇身体集合
         * @param {MoveDirection} p_Direction - 运动方向
         */
        Draw.GetNextPosition = function (p_Bodies, p_Direction) {
            var x = p_Bodies[0].X;
            var y = p_Bodies[0].Y;
            //原点（0，0），上/右/下/左
            switch (p_Direction) {
                case MySnake.MoveDirection.Up:
                    y--;
                    break;
                case MySnake.MoveDirection.Right:
                    x++;
                    break;
                case MySnake.MoveDirection.Down:
                    y++;
                    break;
                case MySnake.MoveDirection.Left:
                    x--;
                    break;
            }
            //返回一个坐标
            var _NewBody = new MySnake.SnakeBody();
            _NewBody.X = x;
            _NewBody.Y = y;
            return _NewBody;
        };
        /**
         * 检查单元格是否被填充
         * @param {HTMLTableElement} p_Table -- 游戏容器的Table
         * @param {number} x - 单元格的列数
         * @param {number} y - 单元格的行数
         */
        Draw.IsCellFilled = function (p_Table, x, y) {
            if (p_Table.rows[y].cells[x].style.backgroundColor == "") {
                return false;
            }
            return true;
        };
        /**
         * 生成随机颜色 -如：'#871ad1'
         */
        Draw.GetRandomColor = function () {
            return '#' + (Math.random() * 0xffffff << 0).toString(16);
        };
        return Draw;
    }());
    MySnake.Draw = Draw;
})(MySnake || (MySnake = {}));
